﻿using System;
using System.Net;
using System.Windows.Forms;

namespace Gui.Functies.Chatserver
{
    public partial class ChatServer : Form
    {
        //update de text in het schermpje
        private delegate void UpdateStatusCallback(string strMessage);
        
        //de server waaraan geconnect word
        Monitor serverMonitor;

        public ChatServer()
        {
            InitializeComponent();
        }

        private void buttonConnect_Click(object sender, EventArgs e)
        {
            //ip uit textbox wordt een IPAddress object. afhandelen zodat null data niet geaccept word
            if (txtIp.Text == "" || txtPort.Text == "")
            {
                txtOutput.AppendText("Ongeldige IP adres / port \r\n");
            }
            else
            {
                //connect of disconnect, afhankelijk van wat op de button staat
                if (buttonConnect.Text == "Connect")
                {
                    //checken of IP adres wel correct is
                    try
                    {
                        IPAddress ipAddress = IPAddress.Parse(txtIp.Text);
                        int serverPort = Convert.ToInt32(txtPort.Text);
                        InitConnection(ipAddress, serverPort);

                    }
                    catch (FormatException)
                    {
                        CloseConnection();
                        txtOutput.AppendText("Ongeldige IP adres / port \r\n");
                    }
                }
                else
                {
                    CloseConnection();
                } 
            } 
        }

        private void InitConnection(IPAddress ip, int port)
        {
            //variabelen van connectie binnenhalen
            IPAddress ipAddress = ip;
            int serverPort = port;

            //Maak een nieuwe instantie van de monitor class aan en geef het ip adress daar aan mee
            serverMonitor = new Monitor(ipAddress, serverPort);

            //event handler
            Monitor.StatusChangedEvent += new StatusChangedEventHandler(serverMonitor_StatusChanged);

            //Roep de methode aan die de connecties checkt
            serverMonitor.StartMonitoring();

            //laat de gebruiker weten dat het monitoren bezig is
            labelServerstatus.Text = "Binnenkomende connecties aan het controleren....";
            txtOutput.AppendText("Server Started....\r\n");

            //fields disablen
            txtIp.Enabled = false;
            txtPort.Enabled = false;
            buttonConnect.Text = "Disconnect";
            txtOutput.ReadOnly = true;
        }

        private void CloseConnection()
        {
            txtIp.Enabled = true;
            txtPort.Enabled = true;
            buttonConnect.Text = "Connect";
            txtOutput.ReadOnly = false;
            labelServerstatus.Text = "Server not started";
            serverMonitor.StopListening();
        }

        private void UpdateStatus(string strMessage)
        {
            //update de log met berichten
            txtOutput.AppendText(strMessage + "\r\n");
        }

        public void serverMonitor_StatusChanged(object sender, StatusChangedEventArgs e)
        {
            this.Invoke(new UpdateStatusCallback(this.UpdateStatus), new object[] {e.eventMessage});
        }
    }
}